package logica;

import java.util.ArrayList;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.spsa.mensajeria.util.ConexionMQ;
import com.spsa.persistencia.dao.InterfazDao;
import com.spsa.persistencia.entidades.EstadoInterfaz;
import com.spsa.persistencia.entidades.Interfaz;
import com.spsa.utilidades.Parametros;
import com.spsa.utilidades.UtilFechas;

public class NotificadorArchivosGenerados {
	
	static final Logger logger = LogManager.getLogger(NotificadorArchivosGenerados.class.getName());

	private List<Interfaz> interfaces;
	private List<EstadoInterfaz> estadosEnviados;
	
	public NotificadorArchivosGenerados() {
		interfaces = InterfazDao.listar();
		estadosEnviados = new ArrayList<EstadoInterfaz>();
	}

	public void ejecutar() {

		while (true) {
			logger.info("Revisando el estado de las interfaces");
			for (int i = 0; i < interfaces.size(); i++) {
				AnalizadorInterfaz analizadoInterfaz = new AnalizadorInterfaz(interfaces.get(i));
				EstadoInterfaz estadoInterfaz = analizadorInterfaz.obtenerEstado();
				
				EstadoInterfaz ultimoEstadoEnviado = buscarUltimoEstadoEnviadoHoy(estadoInterfaz);

				if (ultimoEstadoEnviado == null) {
					enviarMensaje(estadoInterfaz);
					estadosEnviados.add(estadoInterfaz);
				} else {
					if (!sonIguales(estadoInterfaz, ultimoEstadoEnviado)) {
						ultimoEstadoEnviado.setCantidadArchivos(estadoInterfaz.getCantidadArchivos());
						ultimoEstadoEnviado.setCondicion(estadoInterfaz.getCondicion());
						enviarMensaje(estadoInterfaz);
					}
				}
			}
			
			esperarSiguienteRevisionArchivos();
		}
	}

	private void esperarSiguienteRevisionArchivos() {
		try {
			Thread.sleep(Integer.parseInt(Parametros.get("NotificadorArchivosGenerados.TIEMPO_ESPERA_RECONEXION")));
		} catch (Exception e) {
			logger.error(e);
		}
	}
	
	private EstadoInterfaz buscarUltimoEstadoEnviadoHoy(EstadoInterfaz estadoInterfaz) {
		for(int i = 0; i < estadosEnviados.size(); i ++) {
			if(mismaFechaInterfaz(estadosEnviados.get(i), estadoInterfaz))
					return estadosEnviados.get(i);
		}
		
		return null;
	}
	
	private boolean mismaFechaInterfaz(EstadoInterfaz estado1, EstadoInterfaz estado2) {
		if(UtilFechas.sonElMismoDia(estado1.getFecha(), estado2.getFecha()) &&
		   estado1.getDescripcionInterfaz().equals(estado2.getDescripcionInterfaz()))
					return true;
				return false;
	}
	
	private boolean sonIguales(EstadoInterfaz estado1, EstadoInterfaz estado2) {
		if(estado1.getCantidadArchivos() == estado2.getCantidadArchivos() &&
		   estado1.getCondicion() == estado2.getCondicion() &&
		   UtilFechas.sonElMismoDia(estado1.getFecha(), estado2.getFecha()) &&
		   estado1.getDescripcionInterfaz().equals(estado2.getDescripcionInterfaz()))
			return true;
		return false;
	}
	
	private void enviarMensaje(EstadoInterfaz estadoInterfaz) {
		ConexionMQ conexionMQ = ConexionMQ.getInstance();
		
		while(true) {
			try {
				conexionMQ.enviarMensaje(estadoInterfaz);
				logger.info("Se envio el mensaje: " + estadoInterfaz);
				return;
			} catch (Exception e) {
				logger.error("No se pudo enviar el mensaje: " + estadoInterfaz, e);
				logger.info("Intentando conectar a la cola");
				esperarSiguienteIntentoConexion();
				conexionMQ.intentarConectar();
			}
		}
	}
	
	private void esperarSiguienteIntentoConexion() {
		try {
			Thread.sleep(Integer.parseInt(Parametros.get("NotificadorArchivosGenerados.TIEMPO_ESPERA_RECONEXION")));
		} catch (Exception e) {
			logger.error(e);
		}
	}
}
